<?php
/*
        html_get_text_background_color.php
        
        The MIT License
        
        Copyright (c) 2012 Beagle, Inc.　<acp://beagle.bz>
        
        Permission is hereby granted, free of charge, to any person obtaining a copy
        of this software and associated documentation files (the "Software"), to deal
        in the Software without restriction, including without limitation the rights
        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        copies of the Software, and to permit persons to whom the Software is
        furnished to do so, subject to the following conditions:
        
        The above copyright notice and this permission notice shall be included in
        all copies or substantial portions of the Software.
        
        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
        THE SOFTWARE.

*/

/*
find_blind_text

説明
        array find_blind_text(string $file_path,[string $real_url])
                HTMLに含まれるテキストノードの文字色と背景色から、意図的に隠されたテキストノードを抜き出しカラーコードにリプレイスし返します。

パラメータ
        $file_path
                HTMLファイルのパス

        $real_url
                $file_pathがローカルファイルであり、かつ外部に公開しているHTML場合のURL
                ※$file_pathがローカルファイルの場合、指定しないとうまく色を取得できない可能性があります
        
        
返り値
        HTMLファイルの中にあるテキストノードから、隠されたテキストノードの['node'],['bgcolor'],['textcolor']の3つのarrayを含んだarrayを返します。
                Array(
                        ['node']=テキストノード
                        ['bgcolor']=背景色(カラーコード)
                        ['textcolor']=文字色(カラーコード)
                }
        
        背景に画像が設定されている場合、色ではなく文字列'image'を返します。
		iframeの中に入っている場合には、文字色、背景色の配列に文字列'iframe'を返します。
        失敗した場合、FALSEを返します。
*/

function find_blind_text($file_path,$real_url=NULL){
        $node_list=html_get_text_background_color($file_path,$real_url=NULL);
        foreach($node_list as $node_array){
				$node_array['textcolor']=color_replace($node_array['textcolor']);
				$node_array['bgcolor']=color_replace($node_array['bgcolor']);
                if($node_array['textcolor'] === $node_array['bgcolor']){
                        $result[]=$node_array;
                }
        }
        if($result!=NULL){
                return $result;
        }else{
                return FALSE;
        }
}

/*
html_get_text_background_color

説明
        array html_get_text_background_color(string $file_path,[string $real_url])
                HTMLに含まれるテキストノードの文字色と背景色を返します。

パラメータ
        $file_path
                HTMLファイルのパス

        $real_url
                $file_pathがローカルファイルであり、かつ外部に公開しているHTML場合のURL
                ※$file_pathがローカルファイルの場合、指定しないとうまく色を取得できない可能性があります
        
        
返り値
        HTMLファイルの中にあるテキストノードの数だけ、['node'],['bgcolor'],['textcolor']の3つのarrayを含んだarrayを返します。
                Array(
                        ['node']=テキストノード
                        ['bgcolor']=背景色(カラーコード)
                        ['textcolor']=文字色(カラーコード)
                }
        背景に画像が設定されている場合、色ではなく文字列'image'を返します。
        iframeの中に入っている場合には、文字色、背景色の配列に文字列'iframe'を返します。
        失敗した場合、FALSEを返します。
        
*/
function html_get_text_background_color($file_path,$real_url=NULL){
        
        if(!$contents=@file_get_contents($file_path)){
                return FALSE;
        }
        $contents=mb_convert_encoding($contents,"UTF-8","ASCII,JIS,UTF-8,EUC-JP,SJIS");
        
        //htmlかチェック
        if(preg_match("|\<(.*?)html(.*?)\>(.*?)\<\/html\>|isx",$contents)==FALSE){
                return FALSE;
        }
        $contents='<meta http-equiv="content-type" content="text/html; charset=UTF-8" />'.$contents;
        //HTMLの正規化
        $doc = new DOMDocument();
        @$doc->loadHTML($contents);
        $contents=$doc->saveHTML();
        unset($doc);
        
        $contents=strtolower($contents);
        
        //HTMLのパース
        $parsed_contents=str_get_html($contents);
        
        if(!is_object($parsed_contents)){
                return FALSE;
        }
        
        /*  CSS処理  */
        $css_array=Array();
        $rep_pattern='|url\([\s\'\"]*?\)|';
		
        //CSSのリンク抜き出し
        foreach($parsed_contents->find('link') as $element){
                if($element->rel==='stylesheet'){
                        $temporary_contents=NULL;
                        
                        //CSSのパース処理
                        if(!$real_url===NULL){
                                if($temporary_contents=@file_get_contents(get_abs_url($file_path,$element->href))){
                                        $temporary_contents=strtolower($temporary_contents);
										//$temporary_contents=preg_replace($rep_pattern,'url(   )',$temporary_contents);
                                        $css_array[]=new CSSParser($temporary_contents);
                                }else{

                                }
                        }else{
                                if($temporary_contents=@file_get_contents(get_abs_url($real_url,$element->href))){
                                        $temporary_contents=strtolower($temporary_contents);
										//$temporary_contents=preg_replace($rep_pattern,'url(   )',$temporary_contents);
                                        $css_array[]=new CSSParser($temporary_contents);
                                }else{

                                }
                        }
                }
        }
        
        //操作順の関係からソート
        
        //直書きCSSのパース
        foreach($parsed_contents->find('style') as $element){
                $css_string=$element->innertext;
                $css_string=str_replace(Array('<!--','-->'),'',$css_string);
                
                $css_string=strtolower($css_string);
				//$css_string=preg_replace($rep_pattern,'url(  )',$css_string);
                $css_array[]=new CSSParser($css_string);
        }
        
        $css_array=array_reverse($css_array);
        /*  CSS処理おわり  */
		
        //テキストノードの数だけ色の抜き出しを行う
        foreach($parsed_contents->find('text') as $element){
                
                //文字が空の場合を除く
                if(str_replace(Array("\n","\t","\r"," ",'<!--','-->'),'',$element->innertext)===''){
                }else if($element->parent->tag==='a'){
                //aタグ
                        $result=Array();
                        $result['node']=str_replace("\t",'',$element->innertext);
                        $result['bgcolor']=get_style($element,'background-color',$css_array);
                        $result['textcolor']=get_style_a($element,'a',$css_array);
                        $result_array[]=$result;
                }else{
                        $result=Array();
                        $result['node']=str_replace("\t",'',$element->innertext);
                        $result['bgcolor']=get_style($element,'background-color',$css_array);
                        $result['textcolor']=get_style($element,'color',$css_array);
                        $result_array[]=$result;
                }
        }
        
        $parsed_contents->clear();
        unset($css_array);
        return $result_array;
}


function color_replace($color){
        //16進数表記(大文字)の色へと変換
        static $color_list = array(
        'aliceblue' => '#f0f8ff',
        'antiquewhite' => '#faebd7',
        'aqua' => '#00ffff',
        'cyan' => '#00ffff',
        'aquamarine' => '#7fffd4',
        'azure' => '#f0ffff',
        'beige' => '#f5f5dc',
        'bisque' => '#ffe4c4',
        'black' => '#000000',
        'blanchedalmond' => '#ffebcd',
        'blue' => '#0000ff',
        'blueviolet' => '#8a2be2',
        'brown' => '#a52a2a',
        'burlywood' => '#deb887',
        'cadetblue' => '#5f9ea0',
        'chartreuse' => '#7fff00',
        'chocolate' => '#d2691e',
        'coral' => '#ff7f50',
        'cornflowerblue' => '#6495ed',
        'cornsilk' => '#fff8dc',
        'crimson' => '#dc143c',
        'cyan' => '#00ffff',
        'aqua' => '#00ffff',
        'darkblue' => '#00008b',
        'darkcyan' => '#008b8b',
        'darkgoldenrod' => '#b886cd',
        'darkgray' => '#a9a9a9',
        'darkgreen' => '#006400',
        'darkmagenta' => '#8b008b',
        'darkolivegreen' => '#556b2f',
        'darkorange' => '#ff8c00',
        'darkorchid' => '#9932cc',
        'darkred' => '#8b0000',
        'darksalmon' => '#e9967a',
        'darkseagreen' => '#8fbc8f',
        'darkslateblue' => '#483d8b',
        'darkslategray' => '#2f4f4f',
        'darkturquoise' => '#00ced1',
        'darkviolet' => '#9400d3',
        'deeppink' => '#ff1493',
        'deepskyblue' => '#00bfff',
        'dimgray' => '#696969',
        'dodgerblue' => '#1e90ff',
        'firebrick' => '#b22222',
        'floralwhite' => '#fffaf0',
        'forestgreen' => '#228b22',
        'fuchsia' => '#ff00ff',
        'magenta' => '#ff00ff',
        'gainsboro' => '#dcdcdc',
        'ghostwhite' => '#f8f8ff',
        'gold' => '#ffd700',
        'goldenrod' => '#daa520',
        'gray' => '#808080',
        'green' => '#008000',
        'greenyellow' => '#adff2f',
        'honeydew' => '#f0fff0',
        'hotpink' => '#ff69b4',
        'indianred' => '#cd5c5c',
        'indigo' => '#4b0082',
        'ivory' => '#fffff0',
        'khaki' => '#f0e68c',
        'lavender' => '#e6e6fa',
        'lavenderblush' => '#fff0f5',
        'lawngreen' => '#7cfc00',
        'lemonchiffon' => '#fffacd',
        'lightblue' => '#add8e6',
        'lightcoral' => '#f08080',
        'lightcyan' => '#e0ffff',
        'lightgoldenrodyellow' => '#fafad2',
        'lightgreen' => '#90ee90',
        'lightgrey' => '#d3d3d3',
        'lightpink' => '#ffb6c1',
        'lightsalmon' => '#ffa07a',
        'lightseagreen' => '#20b2aa',
        'lightskyblue' => '#87cefa',
        'lightslategray' => '#778899',
        'lightsteelblue' => '#b0c4de',
        'lightyellow' => '#ffffe0',
        'lime' => '#00ff00',
        'limegreen' => '#32cd32',
        'linen' => '#faf0e6',
        'magenta' => '#ff00ff',
        'fuchsia' => '#ff00ff',
        'maroon' => '#800000',
        'mediumaquamarine' => '#66cdaa',
        'mediumblue' => '#0000cd',
        'mediumorchid' => '#ba55d3',
        'mediumpurple' => '#9370db',
        'mediumseagreen' => '#3cb371',
        'mediumslateblue' => '#7b68ee',
        'mediumspringgreen' => '#00fa9a',
        'mediumturquoise' => '#48d1cc',
        'mediumvioletred' => '#c71585',
        'midnightblue' => '#191970',
        'mistyrose' => '#ffe4e1',
        'moccasin' => '#ffe4b5',
        'navajowhite' => '#ffdead',
        'navy' => '#000080',
        'oldlace' => '#fdf5e6',
        'olive' => '#808000',
        'olivedrab' => '#6b8e23',
        'orange' => '#ffa500',
        'orangered' => '#ff4500',
        'orchid' => '#da70d6',
        'palegoldenrod' => '#eee8aa',
        'palegreen' => '#98fb98',
        'paleturquoise' => '#afeeee',
        'palevioletred' => '#db7093',
        'papayawhip' => '#ffefd5',
        'peachpuff' => '#ffdab9',
        'peru' => '#cd853f',
        'pink' => '#ffc0cb',
        'plum' => '#dda0dd',
        'powderblue' => '#b0e0e6',
        'purple' => '#800080',
        'red' => '#ff0000',
        'rosybrown' => '#bc8f8f',
        'royalblue' => '#4169e1',
        'saddlebrown' => '#8b4513',
        'salmon' => '#fa8072',
        'sandybrown' => '#f4a460',
        'seagreen' => '#2e8b57',
        'seashell' => '#fff5ee',
        'sienna' => '#a0522d',
        'silver' => '#c0c0c0',
        'skyblue' => '#87ceeb',
        'slateblue' => '#655acd',
        'slategray' => '#708090',
        'snow' => '#fffafa',
        'springgreen' => '#00ff7f',
        'steelblue' => '#4682b4',
        'tan' => '#d2b48c',
        'teal' => '#008080',
        'thistle' => '#d8bfd8',
        'tomato' => '#ff6347',
        'turquoise' => '#40e0d0',
        'violet' => '#ee82ee',
        'wheat' => '#f5deb3',
        'white' => '#ffffff',
        'whitesmoke' => '#f5f5f5',
        'yellow' => '#ffff00',
        'yellowgreen' => '#9acd32',
        'transparent' => 'transparent'
    );
        
        
        if(strpos($color,'#')===FALSE){
                if(@$result=$color_list[$color]){
                                return $result;
                        }else{
                                return $color;
                }
        }else if(strlen($color)==4){
                $result='#'.$color[1].$color[1].$color[2].$color[2].$color[3].$color[3];
                return $result;
        }else{
                return strtolower($color);
        }
        
}


function css_parser($css,$element){
        //直書きCSSのパース
        $css=strtolower($css);
        $css=str_replace(Array(' ','　','"',"'"),'',$css);
        $css=explode(';',$css);
        foreach($css as $row){
                        $row=explode(':',$row,2);
                        if(trim($row[0])===$element && trim($row[1])!=NULL){
                                return trim($row[1]);
                        }
        }
        return FALSE;
}


function get_abs_url($baseURL, $relativePath) {
        // ベースURL と 相対パス情報から、絶対パス(http(s)://～～)を返す
        //baseURLが指定されていない場合
        if($baseURL == ''){
                return $relativePath;
        }

    if ($relativePath == '') {
        // 相対パスが空の場合は、baseURLをそのまま返す
        return $baseURL;
    }

    if (preg_match('@^https?://@iD', $relativePath)) {
        // 相対パスが http(s):// から始まる場合は、そのまま返す
        return $relativePath;
    }

    // baseURL の分解
    if (!preg_match('@^(https?://[^/]+)/?(.*)$@iD',
        $baseURL, $tmpMatches)
    ) {
        // http(s)://～～から始まらない場合
        if ($baseURL[0] != '/') {
            return false;
        }

        $tmpMatches = array(
            $baseURL,
            '',
            substr($baseURL, 1),
        );
    }

    $base = $tmpMatches[1];     // e.g. http://www.example.com
    $tmpPath = $tmpMatches[2];  // e.g. hoge/fuga/index.php
    $path = array();

    if (preg_match('@^/@iD', $relativePath)) {
        // 相対パスが/から始まる場合
    }

    // baseURLパス情報にディレクトリが含まれていれば
    // baseURLのパス情報をディレクトリ情報のみに
    if (strlen($tmpPath) > 0 && strpos($tmpPath, '/') !== false) {
        if ($tmpPath[strlen($tmpPath) - 1] == '/') {
            // 最後が / なら/を削除
            $tmpPath = substr($tmpPath, 0, -1);
        } else {
            // 最後が / ではない(ファイル名)の場合、/ までを削除
            $tmpPath = substr($tmpPath, 0, strrpos($tmpPath, '/'));
        }

        // ディレクトリ名毎に配列にする
        $path = explode('/', $tmpPath);
    }

    // 相対パス情報をディレクトリ毎に配列にする
    $relativePath = explode('/', $relativePath);

    // 相対パスディレクトリ毎に
    foreach($relativePath as $dir) {
        if ($dir == '.') {
            // /./ は処理をスキップ
            continue;
        }

        if (preg_match('@^\.+$@iD', $dir)) {
            // /../ /.../ などなら、ディレクトリを上にたどる
            for ($i=1; $i < strlen($dir); $i++) {
                array_pop($path);
            }

            continue;
        }

        // .以外のディレクトリ名の場合は、そのまま追加
        $path[] = $dir;
    }

    // パスを/で結合
    $path = implode('/', $path);
    return $base . '/' . $path;
}


function is_image($path){
//画像かどうか調べる


//デバッグ用
$image_debug=TRUE;
        $path=trim($path);
        if(!is_string($path))
        return FALSE;
        
        global $real_url;
        
        $path=str_replace(Array("'",'"',),'',$path);
        //url()の指定がある場合
        if(stripos($path,'url(')!==FALSE){
                preg_match('|url\((.*?)\)|i',$path,$path);
                if(!@$path=$path[1])
                return FALSE;
        }
        

        
        if($image_debug==TRUE){

                return TRUE;
        }
        if($real_url!=''){
                $filepath=get_abs_url($real_url,$path);
        }else{
                $filepath=$path;
        }

        if(!@file_exists($filepath) && @exif_imagetype($filepath)){
                return TRUE;
        }
        return FALSE;
}

function get_style($element,$style_needle,$css_object_array,$attribute_array=Array(),$tag_array=Array()){
        //str get_style(Simple_HTML_DOM $element,int $style_needle,cssparser $css_object)
        //色抜き出し用関数
        
        $result=NULL;
        $attribute_array_flag=FALSE;
        if($element==FALSE){
                switch($style_needle){
                        case 'background-color':
                        case 'background':
                                return 'white';
                                break;
                        
                        case 'color':
                                return 'black';
                                break;
                                
                        default:
                                return FALSE;
                                break;
                }
        }
        
        
        //inframeの場合をはじく
        if($element->tag==='iframe'){
                return 'iframe';
        }
        
        
        //style直
        if($element->style==TRUE){
                //画像の場合
                if($style_needle==='background-color'){
                        if($res=css_parser($element->style,'background-image')){
                                if(is_image($res)){
                                        return 'image';
                                }
                        }
                        //background:url(hogehoge);
                        if($res=css_parser($element->style,'background')){
                                if(stripos($res,'url(')!==FALSE){
                                        if(is_image($res)){
                                                return 'image';
                                        }
                                }
                        }
                        
                }
                
                $result=css_parser($element->style,$style_needle);
        }
        
        //font
        if($element->color==TRUE && $style_needle=='color' && $result==''){
                $result=$element->color;
        }
        
        if($style_needle==='background-color'){
                //backgroundに画像が指定されていた場合
                if($res=$element->background){
                        if(trim($res)!=NULL){
                                if(is_image($res)){
                                        return 'image';
                                }
                        }
                }
                //bgcolor
                if($element->bgcolor==TRUE && $result==''){
                        $result=$element->bgcolor;
                }
        }
        
        
        
        if($result==''){
                foreach($css_object_array as $css_object){
                
                        //背景が画像の場合の処理
                        if($style_needle==='background-color'){
                                if($res=reset($css_object->getProperty($element->tag,'background-image'))){
                                
                                        if(trim($res)!=NULL){
                                                if(is_image($res)){
                                                        return 'image';
                                                }
                                        }
                                }
                                if($res=reset($css_object->getProperty($element->tag,'background'))){
                                
                                        if(trim($res)!=NULL){
                                                if(is_image($res)){
                                                        return 'image';
                                                }
                                        }
                                }
                        }
                
                
                        //ID
                        if($element->id!=''){
                                $element_tag=$element->tag;
                                $element_id=$element->id;
                                
                                //画像
                                if($style_needle==='background-color'){
                                        if($result=end($css_object->getProperty('#'.$element_id,'background-image'))){
                                                if(is_image($result)){
                                                        return 'image';
                                                }
                                        }else if($result=end($css_object->getProperty($element_tag.'#'.$element_id,'background-image'))){
                                                if(is_image($result)){
                                                        return 'image';
                                                }
                                        }else if($result=end($css_object->getProperty('#'.$element_id.' '.$element_tag,'background-image'))){
                                                if(is_image($result)){
                                                        return 'image';
                                                }
                                        }
                                        
                                        //background:url()
                                        else if($result=end($css_object->getProperty('#'.$element_id,'background'))){
                                                if(stripos($result,'url(')!==FALSE){
                                                        if(is_image($result)){
                                                                return 'image';
                                                        }
                                                }
                                        }else if($result=end($css_object->getProperty($element_tag.'#'.$element_id,'background'))){
                                        
                                                if(stripos($result,'url(')!==FALSE){
                                                        if(is_image($result)){
                                                                return 'image';
                                                        }
                                                }
                                        }else if($result=end($css_object->getProperty('#'.$element_id.' '.$element_tag,'background'))){
                                        
                                                if(stripos($result,'url(')!==FALSE){
                                                        if(is_image($result)){
                                                                return 'image';
                                                        }
                                                }
                                        }
                                        
                                }
                                
                                if($result=end($css_object->getProperty('#'.$element_id,$style_needle))){
                                        break;
                                }else if($result=end($css_object->getProperty($element_tag.'#'.$element_id,$style_needle))){
                                        break;
                                }else if($result=end($css_object->getProperty('#'.$element_id.' '.$element_tag,$style_needle))){
                                        break;
                                }else if(end($attribute_array)!=='#'.$element_id){
                                        $attribute_array[]='#'.$element_id;
                                        $attribute_array_flag=TRUE;
                                }
                        }
                        //class
                        if($element->class!=''){
                                $element_tag=$element->tag;
                                $element_class=$element->class;
                                //画像
                                if($style_needle==='background-color'){
                                        if($result=end($css_object->getProperty('.'.$element_class,'background-image'))){
                                                if(is_image($result)){
                                                        return 'image';
                                                }
                                        }else if($result=end($css_object->getProperty($element_tag.'.'.$element_class,'background-image'))){
                                                if(is_image($result)){
                                                        return 'image';
                                                }
                                        }else if($result=end($css_object->getProperty('.'.$element_class.' '.$element_tag,'background-image'))){
                                                if(is_image($result)){
                                                        return 'image';
                                                }
                                        }
                                        
                                        //background:url()
                                        else if($result=end($css_object->getProperty('.'.$element_class,'background'))){
                                        
                                                if(stripos($result,'url(')!==FALSE){
                                                        if(is_image($result)){
                                                                return 'image';
                                                        }
                                                }
                                        }else if($result=end($css_object->getProperty($element_tag.'.'.$element_class,'background'))){
                                        
                                                if(stripos($result,'url(')!==FALSE){
                                                        if(is_image($result)){
                                                                return 'image';
                                                        }
                                                }
                                        }else if($result=end($css_object->getProperty('.'.$element_class.' '.$element_tag,'background'))){
                                        
                                                if(stripos($result,'url(')!==FALSE){
                                                        if(is_image($result)){
                                                                return 'image';
                                                        }
                                                }
                                        }
                                        
                                        
                                }
                                if($result=end($css_object->getProperty('.'.$element_class,$style_needle))){
                                        break;
                                }else if($result=end($css_object->getProperty($element_tag.'.'.$element_class,$style_needle))){
                                        break;
                                }else if($result=end($css_object->getProperty('.'.$element_class.' '.$element_tag,$style_needle))){
                                        break;
                                }else if(end($attribute_array)!=='.'.$element_class){
                                        $attribute_array[]='.'.$element_class;
                                        $attribute_array_flag=TRUE;
                                }
                        }

                        //style
                        $res=reset($css_object->getProperty($element->tag,$style_needle));
                        if($res!==FALSE){
                                $result=$res;
                                break;
                        }
                        
                        //キャッシュ分の検索
                        if(end($tag_array)!==$element->tag){
                                $tag_array[]=$element->tag;
                        }
                        
                        
                        if(count($attribute_array)>=1 && $result==''){
                                $attribute_array_temp=array_reverse($attribute_array);
                                @$tag_string=$tag_array[count($tag_array)-2];
                                $attribute_string=NULL;
                                
                                for($attribute_arrayCnt=0;$attribute_arrayCnt<5;$attribute_arrayCnt++){
                                        if(end($attribute_array_temp)!==FALSE){
                                                $attribute_string=trim(array_pop($attribute_array_temp).' '.$attribute_string);
                                                if($result=end($css_object->getProperty($attribute_string,$style_needle))){
                                                        break;
                                                }else if($result=end($css_object->getProperty($attribute_string.' '.$tag_string,$style_needle))){
                                                        break;
                                                }
                                        }
                                }
                        }
                }       
        }
        if($result==''){
                //background
                if($style_needle==='background-color'){
                        $result=get_style($element,'background',$css_object_array,$attribute_array,$tag_array);
                }else if($style_needle==='background'){
                        $result=get_style($element->parent(),'background-color',$css_object_array,$attribute_array,$tag_array);
                }else{
                        $result=get_style($element->parent(),$style_needle,$css_object_array,$attribute_array,$tag_array);
                }
        }
        return $result;
}

function get_style_a($element,$style_needle,$css_object_array,$attribute_array=Array(),$tag_array=Array()){
//str get_style_a(Simple_HTML_DOM $element,int $style_needle,cssparser $css_object)
//色抜き出し用関数(aタグ用)
        $result=NULL;
        $attribute_array_flag=FALSE;
        //body
        if($element==FALSE){
                return 'blue';
        }
        if($element->tag==='body'){
                if($element->link){
                        return $element->link;
                }else{
                        return 'blue';
                }
        }
        
        //style直
        if($element->tag==='a' && $element->style==TRUE){
                $result=css_parser($element->style,'color');
        }
        
        
        if($result==''){
                
                foreach($css_object_array as $css_object){
                
                        //style
                        if($res=reset($css_object->getProperty('a:link','color'))){
                                $result=$res;
                                break;
                        }
                        
                        if($res=reset($css_object->getProperty('a','color'))){
                                $result=$res;
                                break;
                        }
                
                
                        //ID
                        if($element->id!=''){
                                $element_tag=$element->tag;
                                $element_id=$element->id;
                                
                                if($result=end($css_object->getProperty('#'.$element_id.' a:link','color'))){
                                        break;
                                }else if($result=end($css_object->getProperty('a#'.$element_id.':link','color'))){
                                        break;
                                }else if(end($attribute_array)!=='#'.$element_id){
                                        $attribute_array[]='#'.$element_id;
                                        $attribute_array_flag=TRUE;
                                }
                        }
                        
                        //class
                        if($element->class!=''){
                                $element_tag=$element->tag;
                                $element_class=$element->class;
                                if($result=reset($css_object->getProperty('.'.$element_class.' a:link','color'))){
                                        break;
                                }else if($result=reset($css_object->getProperty('a.'.$element_class.':link','color'))){
                                        break;
                                }else if(end($attribute_array)!=='.'.$element_class){
                                        $attribute_array[]='.'.$element_class;
                                        $attribute_array_flag=TRUE;
                                }
                        }
                        
                        //style
                        $res=reset($css_object->getProperty($element->tag.' a:link','color'));
                        if($res!==FALSE){
                                $result=$res;
                                break;
                        }
                        
                        //キャッシュ分の検索
                        if(end($tag_array)!==$element->tag){
                                $tag_array[]=$element->tag;
                        }
                        
                        if(count($attribute_array)>=1 && $result==''){
                                $attribute_array_temp=array_reverse($attribute_array);
                                @$tag_string=$tag_array[count($tag_array)-2];
                                $attribute_string=NULL;
                                
                                for($attribute_arrayCnt=0;$attribute_arrayCnt<5;$attribute_arrayCnt++){
                                        if(end($attribute_array_temp)!==FALSE){
                                                $attribute_string=trim(array_pop($attribute_array_temp).' '.$attribute_string);
                                                if($result=end($css_object->getProperty($attribute_string.' a:link','color'))){
                                                        break;
                                                }
                                        }
                                }
                        }
                }
        }
        if($result==''){
                $result=get_style_a($element->parent(),$style_needle,$css_object_array,$attribute_array,$tag_array);
        }
        return $result;
}


?>
